<?php
namespace Tbf\Util;
use Tbf\Error;
/**
 * 本类不考虑windows下的路径规则
 * */
/**
 * @deprecated
 */
class PathUtil
{
    /**
     * 把两个路径连起来
     * 主要用于解决直接连接路径出现2-3个/的问题
     * */
    public static function join($path_a,$path_b)
    {
        $path_a = rtrim($path_a,'/');
        $path_b = ltrim($path_b,'/');

        return $path_a.'/'.$path_b;
    }
    /**
     * 从目录中递归获取所有文件,不含目录类型的文件
     * 返回绝对路径
     */
    public static function listFileR($dir,$depth=10)
    {
        $ret = self::listFileRByCallback($dir,function(){
            return true;
        },$depth);

        return $ret;
    }
    /**
     * 从目录中递归获取所有文件,不含目录类型的文件
     * 返回绝对路径
     * 回调格式
     *     传入文件路径,目录也传入
     *     返回是否需要该文件
     *   function (string $path,string $isDir){
     *       return true;
     *   }
     */
    public static function listFileRByCallback($dir,$cb,$depth=10)
    {
        if ($depth<=0) {
            return array();
        }
        $files =  array();
        $dirFiles = self::listDir($dir);
        foreach ($dirFiles as $v1) {
            if (!is_dir($v1)) {
                if ($cb($v1,false)) {
                    $files[]=$v1;
                }
                continue;
            } else {
                if ($cb($v1,true)) {
                    $files = array_merge($files, self::listFileRByCallback($v1,$cb,$depth-1));
                }
                continue;
            }
        }

        return $files;
    }
    /**
     * 以某后缀结尾的所有文件
     @param string $dir 基础路径
     @param string $ext
     @param number $depth
     @return boolean|unknown
     */
    public static function listFileRByExt($dir,$ext,$depth=10)
    {
        $ext = strtolower($ext);
        $ret = self::listFileRByCallback($dir,function($path,$isDir) use ($ext) {
            if ($isDir) {
                return true;
            }
            if (path::getExt($path)==$ext) {
                return true;
            } else {
                return false;
            }
        },$depth);

        return $ret;
    }
    /**
     * 相对文件目录
     * 返回格式 abc/edf
     */
    public static function refPath($fullPath,$base)
    {
        $ref = StringUtil::removeFromStart($fullPath,$base);
        if ($ref===false) {
            return false;
        }
        $ref = trim($ref,'/');

        return $ref;
    }
    /**
     从目录中获取所有文件
     返回绝对路径，而不仅仅是文件名
     */
    public static function listDir($originDir,$filter = array())
    {
        static $default_filter = array('.'=>1,'..'=>1,'.git'=>1);
        $filter = array_merge($default_filter,$filter);
        $files = array();
        $dir = realpath($originDir);
        $handle = opendir($dir);
        if ($handle===false) {
            throw new Error\FileException('listDir打开目录失败，目录不存在？'.$originDir);

            return;
        }
        while (true) {
            $file = readdir($handle);
            if ($file===false) {
                break;
            }
            if (!empty($filter[$file])) {
                continue;
            }
            $files[]=$dir.'/'.$file;
        }

        return $files;
    }
    /**
     从文件路径获取扩展名
     自动转换为小写
     */
    public static function getExt($path)
    {
        $pos = strrpos($path,'.');
        if ($pos===false) {
            return '';
        }

        return strtolower(substr($path,$pos+1));
    }
}
